A third tab beside Files and Diff, so the review that already happens on the phone can end in a commit and a push instead of a walk back to the computer. Owner-only. Every operation is a tap on a closed allow-list — stage, unstage, commit, fetch, pull --ff-only, push, checkout, branch, revert file. No free-text command ever reaches the machine.
The index is the whole model. Staged, Changes, Untracked, Conflicts are the only groups, in that order, and a row belongs to exactly one. Nothing is summarised into a count the user has to trust.
One glyph, one colour, one meaning. Green is staged, amber is a working change, red is a conflict, grey is untracked. The chip carries the letter git already uses, so the panel teaches nothing new.
The composer is pinned, the list scrolls. Commit is always reachable without scrolling, and the three remote verbs sit under it where they cannot be hit by mistake while staging.
The phone declines what it cannot do well. Merges, rebases and conflict resolution are named and handed back to the computer rather than half-built here.
Branch, divergence and upstream in three facts on two lines; the whole block is the doorway to the branch sheet, with refresh as its own 44 pt target. Long paths middle-truncate from the left so the filename never moves. Counts sit under the path rather than beside it, which keeps the action pill at a fixed right edge down the whole list.
Empty sections are removed, not shown empty. The composer stays visible and disabled so the surface does not change shape between states, and the caption answers the only question left: when was this last true, and against what.
Conflicts take the top of the list and Staged disappears, because nothing can be staged while the index is unmerged. Conflict rows carry no action pill — only a chevron to the diff — and the disabled Commit is explained in place rather than by a toast.
The spinner lives in the button that started the work, the label states the verb in progress, and the count drops because it is no longer a promise. Nothing else locks: staging can continue while the push runs.
One sentence of ours, then the first line of git's stderr verbatim in mono. A developer recognises (fetch first) instantly, and we do not try to translate it. Dismissible, and the composer keeps working underneath.
The refusal is the feature. Amber rather than red, because nothing is broken and nothing was lost; the strip names the destination — the computer — instead of offering a merge the phone should not be running.
The skeleton holds the real geometry — section label, chip, path, trailing action — so the list does not jump when status arrives. Branch name is already known from the session, so only the counters and the rows are unresolved.
Unchanged from today's viewer: dark code field, hunk headers, gutter numbers, added and removed lines tinted rather than only signed. The path takes the title, the Diff tab stays lit, and the totals sit opposite the segmented control instead of adding a row.
Working / Staged is the one new control, and it answers the question the panel creates: what exactly will this commit contain. The totals change with the side, which is how the user sees that a partially staged file has two truths.
The destructive verb is one level down, last in the menu, in danger ink, with a trailing ellipsis promising a second step. It leads to D. Nothing in the menu acts immediately.
Current branch first with a check and the word current; everything else is ordered by last commit, which is the order people actually think in. New branch… sits above the list in accent because creating is safe, while every other row is a checkout that may not be.
The row expands in place rather than pushing a screen, and its label states the base branch so the one fact a name cannot carry is present. Create is the only filled control in the sheet.
One sheet for both losses: revert file, and checkout with a dirty tree. Count in the title, the exact paths in mono with their counts, then the sentence that says what survives. Discard is filled danger and sits right, Cancel is quiet and sits left, and the whole thing reads in a breath.
Two-step is reserved. Only revert file and dirty checkout raise D. Unstage, fetch and a refused pull are all recoverable in one tap, so a confirmation there would only teach people to dismiss confirmations.
Errors are quoted, not paraphrased. The first stderr line goes on screen in mono. Our own sentence above it says what happened in product terms; we never rewrite git's words into something a search engine cannot match.
Open questions. Bulk Stage all / Unstage all per section is not drawn here and needs a decision. Hunk-level staging is deliberately out. Amend, stash and force-push are absent by design.